package org.cybzacg.convert.context;


import org.cybzacg.convert.enums.ConversionStrategyEnum;
import org.cybzacg.convert.enums.ConversionType;

import java.util.Map;

/**
 * 转换上下文接口
 * 提供转换过程中的上下文信息和配置
 *
 * @author cybzacg.blog
 * @version 3.0
 * @since 3.0
 */
public interface ConversionContext {

    /**
     * 获取转换策略
     *
     * @return 转换策略
     */
    ConversionStrategyEnum getStrategy();

    /**
     * 设置转换策略
     *
     * @param strategy 转换策略
     */
    void setStrategy(ConversionStrategyEnum strategy);

    /**
     * 获取源类型
     *
     * @return 源类型
     */
    Class<?> getSourceType();

    /**
     * 设置源类型
     *
     * @param sourceType 源类型
     */
    void setSourceType(Class<?> sourceType);

    /**
     * 获取目标类型
     *
     * @return 目标类型
     */
    Class<?> getTargetType();

    /**
     * 设置目标类型
     *
     * @param targetType 目标类型
     */
    void setTargetType(Class<?> targetType);

    /**
     * 获取转换类型
     *
     * @return 转换类型
     */
    ConversionType getConversionType();

    /**
     * 设置转换类型
     *
     * @param conversionType 转换类型
     */
    void setConversionType(ConversionType conversionType);

    /**
     * 获取默认值
     *
     * @param <T> 值类型
     * @return 默认值
     */
    <T> T getDefaultValue();

    /**
     * 设置默认值
     *
     * @param defaultValue 默认值
     * @param <T>          值类型
     */
    <T> void setDefaultValue(T defaultValue);

    /**
     * 获取属性
     *
     * @param key 属性键
     * @param <T> 属性值类型
     * @return 属性值
     */
    <T> T getProperty(String key);

    /**
     * 设置属性
     *
     * @param key   属性键
     * @param value 属性值
     * @param <T>   属性值类型
     */
    <T> void setProperty(String key, T value);

    /**
     * 获取所有属性
     *
     * @return 属性映射
     */
    Map<String, Object> getProperties();

    /**
     * 检查是否启用缓存
     *
     * @return 是否启用缓存
     */
    boolean isCacheEnabled();

    /**
     * 设置是否启用缓存
     *
     * @param cacheEnabled 是否启用缓存
     */
    void setCacheEnabled(boolean cacheEnabled);

    /**
     * 检查是否启用验证
     *
     * @return 是否启用验证
     */
    boolean isValidationEnabled();

    /**
     * 设置是否启用验证
     *
     * @param validationEnabled 是否启用验证
     */
    void setValidationEnabled(boolean validationEnabled);

    /**
     * 获取超时时间（毫秒）
     *
     * @return 超时时间
     */
    long getTimeout();

    /**
     * 设置超时时间（毫秒）
     *
     * @param timeout 超时时间
     */
    void setTimeout(long timeout);

    /**
     * 获取转换深度
     *
     * @return 转换深度
     */
    int getDepth();

    /**
     * 设置转换深度
     *
     * @param depth 转换深度
     */
    void setDepth(int depth);

    /**
     * 增加转换深度
     */
    void incrementDepth();

    /**
     * 检查是否超过最大深度
     *
     * @param maxDepth 最大深度
     * @return 是否超过最大深度
     */
    boolean isDepthExceeded(int maxDepth);

    /**
     * 创建子上下文
     *
     * @param sourceType 源类型
     * @param targetType 目标类型
     * @return 子上下文
     */
    ConversionContext createChildContext(Class<?> sourceType, Class<?> targetType);

    /**
     * 复制上下文
     *
     * @return 复制的上下文
     */
    ConversionContext copy();

    /**
     * 清理上下文
     */
    void clear();
}
